{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "<font color=\"red\">可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<font color=\"red\">接下来，定义用于训练的网络，首先定义网络的输入。</font>\n",
    "<br><br>\n",
    "<font color=\"red\">这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和label数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。</font>\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。  \n",
    "这里的参数-1是batchsize，-1代表自动计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\layers\\python\\layers\\layers.py:1624: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.flatten instead.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-13-413a88f1eb86>:3: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-14-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.251063, the validation accuracy is 0.9324\n",
      "after 200 training steps, the loss is 0.178406, the validation accuracy is 0.9586\n",
      "after 300 training steps, the loss is 0.164329, the validation accuracy is 0.9608\n",
      "after 400 training steps, the loss is 0.117193, the validation accuracy is 0.9678\n",
      "after 500 training steps, the loss is 0.234043, the validation accuracy is 0.9714\n",
      "after 600 training steps, the loss is 0.0695418, the validation accuracy is 0.9766\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.225627, the validation accuracy is 0.9786\n",
      "after 800 training steps, the loss is 0.0920383, the validation accuracy is 0.9822\n",
      "after 900 training steps, the loss is 0.0828144, the validation accuracy is 0.9824\n",
      "after 1000 training steps, the loss is 0.149655, the validation accuracy is 0.9802\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9844\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
